package org.jeecg.modules.oms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.oms.entity.SemiProductSalesOrderProgress;

import java.util.Date;
import java.util.List;

/**
 * 半成品销售订单进度Service接口
 */
public interface ISemiProductSalesOrderProgressService extends IService<SemiProductSalesOrderProgress> {

    /**
     * 根据订单ID查询进度记录列表
     * @param orderId 订单ID
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByOrderId(String orderId);

    /**
     * 分页查询进度记录
     * @param page 分页参数
     * @param progress 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrderProgress> queryProgressPage(Page<SemiProductSalesOrderProgress> page, SemiProductSalesOrderProgress progress);

    /**
     * 根据状态查询进度记录
     * @param orderId 订单ID
     * @param status 状态
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByStatus(String orderId, Integer status);

    /**
     * 根据操作人查询进度记录
     * @param operatorId 操作人ID
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByOperator(String operatorId);

    /**
     * 根据操作类型查询进度记录
     * @param operationType 操作类型
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByOperationType(String operationType);

    /**
     * 获取订单最新进度记录
     * @param orderId 订单ID
     * @return 最新进度记录
     */
    SemiProductSalesOrderProgress getLatestByOrderId(String orderId);

    /**
     * 添加进度记录
     * @param progress 进度记录
     * @return 添加结果
     */
    boolean addProgress(SemiProductSalesOrderProgress progress);

    /**
     * 更新进度记录
     * @param progress 进度记录
     * @return 更新结果
     */
    boolean updateProgress(SemiProductSalesOrderProgress progress);

    /**
     * 删除进度记录
     * @param id 记录ID
     * @return 删除结果
     */
    boolean deleteProgress(String id);

    /**
     * 记录状态变更
     * @param orderId 订单ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @param operationType 操作类型
     * @param operationContent 操作内容
     * @param changeReason 变更原因
     * @param remark 备注
     * @return 记录结果
     */
    boolean recordStatusChange(String orderId, Integer oldStatus, Integer newStatus, 
                              String operatorId, String operatorName, String operationType, 
                              String operationContent, String changeReason, String remark);

    /**
     * 统计进度记录数量
     * @param orderId 订单ID
     * @return 记录数量
     */
    Integer countByOrderId(String orderId);

    /**
     * 根据时间范围查询进度记录
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByTimeRange(Date startTime, Date endTime);

    /**
     * 批量插入进度记录
     * @param progressList 进度记录列表
     * @return 插入结果
     */
    boolean batchInsertProgress(List<SemiProductSalesOrderProgress> progressList);

    /**
     * 根据订单ID和状态范围查询进度记录
     * @param orderId 订单ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @return 进度记录列表
     */
    List<SemiProductSalesOrderProgress> getByStatusRange(String orderId, Integer oldStatus, Integer newStatus);

    /**
     * 验证进度记录数据
     * @param progress 进度记录
     * @return 验证结果
     */
    boolean validateProgress(SemiProductSalesOrderProgress progress);

    /**
     * 获取订单状态变更历史
     * @param orderId 订单ID
     * @return 状态变更历史
     */
    List<SemiProductSalesOrderProgress> getStatusChangeHistory(String orderId);

    void deleteByOrderId(String id);
}
